package com.library.books.domain.vo.borrow;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.library.common.annotation.Excel;
import com.library.common.core.serialize.DesensitizeSerialize;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

/**
 * @ClassName: BooksJoinBorrowRecord
 * @Description: 书架、书籍、书籍副本、借阅记录实体类
 * @Author: hb
 * @Date: 2024/10/16
 */
@Data
public class BooksJoinBorrowRecord {

    /** 书架名称：A书架 */
    @ApiModelProperty("书架名称：A书架")
    @Excel(name = "书架名称：A书架")
    private String bookShelfName;

    /** 编目id */
    @ApiModelProperty("编目id")
    private Long booksId;

    /** ISBN号 */
    @ApiModelProperty("ISBN号")
    @Excel(name = "ISBN号")
    private String booksIsbn;

    /** 书籍名称 */
    @ApiModelProperty("书籍名称")
    @Excel(name = "书籍名称")
    private String booksName;

    /** 书籍类别 */
    @ApiModelProperty("书籍类别")
    @Excel(name = "书籍类别")
    private String booksType;

    /** 书籍作者 */
    @ApiModelProperty("书籍作者")
    @Excel(name = "书籍作者")
    private String booksAuthor;

    /** 出版社 */
    @ApiModelProperty("出版社")
    @Excel(name = "出版社")
    private String booksPublisher;

    /** 内容简介 */
    @ApiModelProperty("内容简介")
    @Excel(name = "内容简介")
    private String booksSynopsis;

    /** 封面图片 */
    @ApiModelProperty("封面图片")
    @Excel(name = "封面图片")
    private String booksCoverPhoto;


    /** 书架id */
    @ApiModelProperty("书架id")
    @Excel(name = "书架id")
    private Long bookShelfId;

    /** RFID号 */
    @ApiModelProperty("RFID号")
    @Excel(name = "RFID号")
    private String booksCopyRfid;

    /** BARCODE号 */
    @ApiModelProperty("条码号")
    @Excel(name = "条码号")
    private String booksCopyBarcode;

    /** 状态：0：正常，1：借出，2：未上架 */
    @ApiModelProperty("状态：0：正常，1：借出，2：未上架")
    @Excel(name = "状态：0：正常，1：借出，2：未上架")
    private String booksCopyStatus;

    /** 小类索书号 */
    @ApiModelProperty("小类索书号")
    @Excel(name = "小类索书号")
    private String booksCopyLicense;

    /** borrowId */
    @ApiModelProperty("borrowId")
    @Excel(name = "borrowId")
    private Long borrowId;

    /** 书籍副本id */
    @ApiModelProperty("书籍副本id")
    @Excel(name = "书籍副本id")
    private Long booksCopyId;

    /** 借阅人卡号 */
    @ApiModelProperty("借阅人卡号")
    @Excel(name = "借阅人卡号")
    private String borrowCard;

    /** 借阅天数 */
    @ApiModelProperty("借阅天数")
    @Excel(name = "借阅天数")
    private Integer borrowDays;

    /** 续借天数 */
    @ApiModelProperty("续借天数")
    @Excel(name = "续借天数")
    private Integer borrowRenewDays;

    /** 续借次数 */
    @ApiModelProperty("续借次数")
    @Excel(name = "续借次数")
    private Long borrowRenewNum;

    /** 续借时间 */
    @ApiModelProperty("续借时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "续借时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date borrowRenewTime;

    /** 归还时间 */
    @ApiModelProperty("归还时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "归还时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date borrowReturnTime;

    /** 应还时间 */
    @ApiModelProperty("应还时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "应还时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date borrowShouldReturnTime;

    /** 逾期天数（创建时间[借阅时间]与当天相差时间 ） */
    @ApiModelProperty("逾期天数")
    @Excel(name = "逾期天数")
    private Long borrowOverdueDays;

    /** 已逾期天数 */
    @ApiModelProperty("已逾期天数")
    @Excel(name = "已逾期天数")
    private Long borrowOverdueTotalDays;

    /** 借阅状态：0：正常，1：逾期 */
    @ApiModelProperty("借阅状态")
    @Excel(name = "借阅状态" , dictType = "borrow_status")
    private String borrowStatus;

    /** 创建时间-借阅时间 */
    @ApiModelProperty("创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /** 副本借阅规则id */
    private Long booksRuleId;

    /** 规则名称 */
    @ApiModelProperty("规则名称")
    @Excel(name = "规则名称")
    private String booksRuleName;

    /** 借阅限制天数 */
    @ApiModelProperty("借阅限制天数")
    @Excel(name = "借阅限制天数")
    private Long booksRuleTerm;

    /** 逾期滞纳金 */
    @ApiModelProperty("逾期滞纳金")
    @Excel(name = "逾期滞纳金")
    private BigDecimal booksRuleTarryFine;

    /** 是否续借：0：是，1：否 */
    @ApiModelProperty("是否续借：0：是，1：否")
    @Excel(name = "是否续借：0：是，1：否")
    private String booksRuleRenew;

    /** 续借次数 */
    @ApiModelProperty("续借次数")
    @Excel(name = "续借次数")
    private Long booksRuleRenewNum;

    /** 续借限制天数 */
    @ApiModelProperty("续借限制天数")
    @Excel(name = "续借限制天数")
    private Long booksRuleRenewTerm;

    /** 规则状态：0，正常，1：停用 */
    @ApiModelProperty("规则状态：0，正常，1：停用")
    @Excel(name = "规则状态：0，正常，1：停用")
    private String booksRuleStatus;

    /** 学号 */
    @ApiModelProperty("学号")
    @Excel(name = "学号")
    private String studentNumber;

    /** 学生姓名 */
    @ApiModelProperty("学生姓名")
    @Excel(name = "学生姓名")
    @JsonSerialize(using = DesensitizeSerialize.class)
    private String studentName;


    /** 借阅人应该给的滞纳金 */
    @ApiModelProperty("滞纳金")
    private BigDecimal borrowTakeTarryFine;

    /// 自助机要使用

    /** 操作平台 */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String operateTerrace;

    /** 操作员卡号 */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String operateCard;

    /** 操作编号(用户编号/学生编号) */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String operateNumber;

    /** 创建人id */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long createId;

    /** 创建者 */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String createBy;

    /** 修改人id */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long updateId;

    /** 修改人 */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String updateBy;

    /** 借阅日期 */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Date startTime;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Date endTime;

    /** 这个判断没必要给sql，手动处理负数 */
    public void setBorrowOverdueDays(long borrowOverdueDays) {
        this.borrowOverdueDays = Math.max(borrowOverdueDays,0);
    }

    /** 当前逾期天数也算作总天数 */
    public void setBorrowOverdueTotalDays(long borrowOverdueTotalDays) {
        this.borrowOverdueTotalDays = Math.max(borrowOverdueTotalDays ,0);
    }
}
